﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.Text;
using ParieurPro.DAL.DatabaseModel;
using ParieurPro.DAL.Exception;
using System.Data.SqlClient;

namespace ParieurPro.DAL
{
    /// <summary>
    /// Classe de gestion d'une équipe.
    /// Une équipe est constituée :
    /// - un identifiant
    /// - un nom
    /// - une image (écusson)
    /// </summary>
    [Serializable()]
    public class TeamObject
    {

        #region Attributes
        private int _teamId;
        private string _name;
        private string _shortName;
        private byte[] _image;
        #endregion

        #region Properties

        /// <summary>
        /// Identifiant unique de l'équipe
        /// </summary>
        [Key()]
        [DataMemberAttribute()]
        public int TeamId
        {
            get { return _teamId; }
            set { _teamId = value; }
        }

        /// <summary>
        /// Nom de l'équipe (nom complet)
        /// Ex : Stade rennais FC 
        /// </summary>
        [DataMemberAttribute()]
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        /// <summary>
        /// Nom de l'équipe (nom complet)
        /// Ex : Stade rennais FC 
        /// </summary>
        [DataMemberAttribute()]
        public string ShortName
        {
            get { return _shortName; }
            set { _shortName = value; }
        }

        /// <summary>
        /// Image (écusson) de l'équipe
        /// </summary>
        [DataMemberAttribute()]
        public byte[] Image
        {
            get { return _image; }
            set { _image = value; }
        }

        #endregion

        #region Data access

        /// <summary>
        /// Copie l'objet représentant la table "Teams" de la base de données
        /// en objet "TeamObject"
        /// </summary>
        /// <param name="dataToCopy">Objet à copier</param>
        /// <returns>Objet copié</returns>
        /// <exception cref="ArgumentException">L'objet à copier vaut null</exception>
        public static TeamObject CopyFromDatabaseObject(Teams dataToCopy)
        {
            if (dataToCopy == null)
            {
                throw new ArgumentException("TeamObject.CopyFromDatabaseObject - dataToCopy can not be null");
            }
            TeamObject team = new TeamObject();
            team.TeamId = dataToCopy.TeamId;
            team.Name = dataToCopy.Name.Trim();
            team.ShortName = dataToCopy.ShortName.Trim();
            team.Image = dataToCopy.Icon;
            return team;
        }

        /// <summary>
        /// Renvoi l'identifiant de l'équipe à partir de son nom long (non sensible à la casse)
        /// </summary>
        /// <param param name="dbContext">Connexion à la base de données</param>
        /// <param name="teamName">Nom long de l'équipe</param>
        /// <returns>Identifiant de l'équipe (0 si l'équipe n'existe pas)</returns>
        /// <exception cref="ArgumentException">dbContext vaut null</exception>
        public static int GetTeamId(MyBetDBEntities dbContext, string teamName)
        {
            if (dbContext == null)
            {
                throw new ArgumentException("TeamObject.GetTeamId - dbContext can not be null");
            }
            var query = (from t in dbContext.Teams
                         where t.Name.ToUpper() == teamName.ToUpper()
                         select t.TeamId);
            int teamsId = query.SingleOrDefault();
            return teamsId;
        }

        /// <summary>
        /// Chargement de l'ensemble des équipes connues en base de données
        /// pour une mise en cache
        /// Fonction utilisée pour la version SmartPhone du site
        /// </summary>
        /// <param name="dbContext"></param>
        /// <returns>Liste des équipes au format "TeamObject"</returns>
        /// <exception cref="ArgumentException">dbContext vaut null</exception>
        public static List<TeamObject> LoadTeamsObject(MyBetDBEntities dbContext)
        {
            if (dbContext == null)
            {
                throw new ArgumentException("TeamObject.LoadTeams - dbContext can not be null");
            }
            // Chargement de la liste des équipes
            List<TeamObject> retList = new List<TeamObject>();
            var query = (from team in dbContext.Teams orderby team.TeamId select team);
            IEnumerable<Teams> teams = query.ToList();
            foreach (Teams t in teams)
            {
                retList.Add(TeamObject.CopyFromDatabaseObject(t));
            }
            return retList;
        }

        /// <summary>
        /// Chargement de l'ensemble des équipes connues en base de données
        /// pour une mise en cache
        /// Fonction utilisée pour la version SmartPhone du site 
        /// </summary>
        /// <returns>Liste des équipes au format "Teams"</returns>
        /// <exception cref="ArgumentException">dbContext vaut null</exception>
        public static List<Teams> Load(MyBetDBEntities dbContext)
        {
            if (dbContext == null)
            {
                throw new ArgumentException("TeamObject.Load - dbContext can not be null");
            }
            List<TeamObject> retList = new List<TeamObject>();
            var query = (from team in dbContext.Teams
                         orderby team.TeamId
                         select team);
            List<Teams> teams = query.ToList();
            return teams;
        }

        #endregion

    }
}